const express = require('express')

const admin = express.Router()

const { User } = require('../model/user')

const { Article } = require('../model/article')

const bodyParser = require('body-parser')

// 导入分页模块
const pagination = require('mongoose-sex-page')

admin.use(bodyParser.urlencoded({ extended: false }))

admin.get(['/', '/index'], (req, res) => {
  res.render('admin/login')
})

admin.get('/user', async (req, res) =>
{
  // 这里的req.username输出的是 undefined 所以需要session来存放
  // console.log(req.username)

  // 分页的制作
  // 接收客户端传递过来的页数
  let page = req.query.page || 1
  // 每一页显示的数据条数
  let pageSize = 5
  // 查询用户的总数
  let count = await User.countDocuments()
  // 计算得到页数
  let total = Math.ceil(count / pageSize)
  // 通过limit来限制每次查询的条数  通过skip来跳过已经查询过的条数
  let result = await User.find().limit(pageSize).skip((page - 1) * pageSize)

  // let result = await User.find()

  res.render('admin/user', {
    // 不使用session的话 这里是拿不到的
    // name: req.username
    // 因为username是一个公用对象 许多页面都需要显示名字 如果我们通过这种方式放到页面中 那么每次都需要进行这样的操作,
    // 所以就可以通过 app.locals 公共数据来处理这些
    // name: req.session.username
    result,
    total,
    page,
    count
  })

  // 现在我们这里已经使用的是 公共数据了  app.locals.userInfo 我们网址中直接输入 /admin/user 时会报错因为我们还没有的登录
  // 没有 userInfo这个值  我们需要解决这个问题 在header.html

})

admin.get('/user-edit', async (req, res) => {
  let { message, id } = req.query
  let result
  if (id) {

    result = await User.findOne({ _id: id })
  }
  res.render('admin/user-edit', {
    message,
    id,
    result

  })
})

admin.get('/delete', async (req, res) => {
  let { id } = req.query
  await User.findOneAndDelete({ _id: id })
  res.redirect('/admin/user')
})

// 文章页面
admin.get('/article', async (req, res) => {
  // 接收传递过来的页码
  let { page } = req.query

  // 因为作者是 一个对象id  是关联集合 所以这里应该使用联合查询
  // let result = await Article.find().populate('writer')

  // 还需要处理一下时间样式  在app.js中引入 dateFormat 模块 再引入 art-template 模块 再在 template.defaults.imports配置
  // 我们之前制作分页的方式太麻烦了 可以使用第三方模块制作分页 但是要记住开始那种制作分页的方法 那是原理
  // page表示当前的页码
  // size 表示每一页显示的数据条数
  // display 表示客户端显示的页码数量
  // exec 表示按照上面的要求查找数据 并进行分析
  let result = await pagination(Article).
    // 每个用户只查找自己的文章  所以这里先把文章查找出来 再根据下面的限制来返回
    find({ writer: req.app.locals.userInfo._id }).
    page(page).
    size(2).
    display(3).
    populate('writer').
    exec()
  res.render('admin/article', {
    article: result
  })
})

// 文章修改页面
admin.get('/article-edit', async (req, res) => {
  let { id } = req.query
  let result
  if (id) {
    result = await Article.findOne({ _id: id })
  }
  res.render('admin/article-edit', {
    result
  })
})

// 文章删除页面
admin.get('/article-delete', async (req, res) => {
  let { id } = req.query
  await Article.findOneAndDelete({ _id: id })
  res.redirect('/admin/article')
})

admin.post('/login', async (req, res) => {
  const { email, password } = req.body
  // 如果客户端禁用了js代码的话 在页面中进行的验证就不起作用了  我们这个时候需要在服务器端也进行一次验证
  if (email.trim().length === 0 || password.trim().length === 0) {
    return res.status(400).send(`
      <h1>邮箱或密码错误</h1>
      <button> <a href="/admin/index">返回</a></button>
    `)
  }
  // 比对数据中的邮箱或密码，判断是否正确
  let a = await User.findOne({ email, password })
  if (a === null) {
    res.send(`
      <h1>登陆失败，二秒后自动跳转</h1>
      <script >
        setTimeout(()=>{
          location.href="http://localhost/admin/index"
        },2000)
      </script>
    `)
  }

    // 这里我们传入的对象确实是可以在user-edit中渲染出来的， 但是仅仅限于从这里开始跳转才是 如果到了后面从其他页面跳转到这个页面
  // 是渲染不出来的 ，我们需要存储到本地 也就是 cookie & session  我们需要下载一个第三方工具 npm install express-session
  else {

    // session 就是服务器端的一个对象  session有一个特点 当服务器端重启的时候 session就会失效  使用nodemon 每一次执行都会重启服务器端
    // 目前我们已经安装并且 配置好了 express-session  这个时候我们就可以将用户的信息存储到服务器段的 session 中去了
    // 向session中存储数据时，服务器会自动添加一个sessionId的东西 这是信息的唯一标识符
    req.session.username = a.name
    req.session.userRole = a.role
    // 这里如果没有使用 session 在其他地方使用 req.username 是不会生效的
    // req.username = a.name

    // 使用公共数据
    // 使用公共数据需要放到 app 中去  app 不需要引入 直接使用 req.app就可以了  一般使用数据还是使用这里的数据
    // 刚刚 给session中传入的数据只是为了生成 sessionId 这个标识符 这个标识符放在cookie中 客服端发送请求时会携带cookie
    // 也就相当于将 sessionId 发送过去了 就可以辨识用户了
    req.app.locals.userInfo = a
    if (a.role === '超级管理员') {
      // express 中的重定向不需要使用 res.writeHead(301,{ Location : '/admin/user' }) 可以直接使用 res.redirect
      res.redirect('/admin/user')
    } else {
      res.redirect(`/home/index`)

    }

  }
})

admin.post('/user-add', require('../joi').user_add)

admin.post('/user-edit', require('../joi').user_edit)

admin.post('/article-add', require('../joi').article_add)

admin.post('/article-edit', require('../joi').article_edit)

// 退出功能
admin.get('/layout', (req, res) => {
  // 使用这个方法自动删除 session 而不是手动让它等于undefined  接收一个参数 删除session后做些什么
  req.session.destroy(function () {
    // 清除cookie   下面三个操作都需要放到这个函数中来 不然不会执行下面的操作了
    res.clearCookie('connect.sid')
    req.app.userInfo = undefined
    res.redirect('/admin/index')
  })
})

module.exports = admin